﻿
#include "resource.h"
#include <stdio.h>     // 标准输入输出头文件，用于printf等函数
#include <windows.h>   // Windows应用程序接口头文件
#include <string>
// 声明主窗口过程函数，用于处理窗口消息
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

// 程序入口点
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    char       szClassName[] = "MainWClass";   // 窗口类名
    WNDCLASSEX wndclass;                       // 定义窗口类的结构体

    // 初始化窗口类结构体
    wndclass.cbSize        = sizeof(wndclass);
    wndclass.style         = CS_HREDRAW | CS_VREDRAW;   // 重绘样式，水平和垂直
    wndclass.lpfnWndProc   = MainWndProc;               // 指向窗口过程的函数指针
    wndclass.cbClsExtra    = 0;                         // 额外的类信息
    wndclass.cbWndExtra    = 0;                         // 额外的窗口信息
    wndclass.hInstance     = hInstance;                 // 应用程序实例句柄
    wndclass.hIcon         = ::LoadIcon(NULL, (LPCSTR)IDI_APP);     // 加载应用程序图标
    wndclass.hCursor       = ::LoadCursor(NULL, IDC_ARROW);           // 加载箭头光标
    wndclass.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);   // 设置背景颜色为白色
    wndclass.lpszMenuName  = (LPSTR)IDR_TYPER;                        // 无菜单
    wndclass.lpszClassName = szClassName;                             // 设置窗口类名
    wndclass.hIconSm       = NULL;                                    // 小图标

    // 注册窗口类
    ::RegisterClassEx(&wndclass);

    // 创建主窗口
    HWND hWnd = ::CreateWindowEx(0,
                                 szClassName,           // 类名
                                 "我的第一个GUI程序",   // 窗口标题
                                 WS_OVERLAPPEDWINDOW,   // 窗口样式，重叠式窗口
                                 CW_USEDEFAULT,         // 默认位置
                                 CW_USEDEFAULT,         // 默认位置
                                 CW_USEDEFAULT,         // 默认宽度
                                 CW_USEDEFAULT,         // 默认高度
                                 NULL,                  // 无父窗口
                                 NULL,                  // 无菜单
                                 hInstance,             // 应用程序实例句柄
                                 NULL);                 // 无额外参数
    if (NULL == hWnd) {
        ::MessageBox(NULL, "创建窗口失败", "错误", MB_OK);   // 显示错误消息框
        return -1;   // 创建窗口失败，返回错误代码
    }

    // 显示窗口
    ::ShowWindow(hWnd, nCmdShow);   // 根据nCmdShow参数显示窗口
    ::UpdateWindow(hWnd);           // 立即重绘窗口

    // 消息循环
    MSG msg;
    while (::GetMessage(&msg, NULL, 0, 0))   // 从消息队列中获取消息
    {
        ::TranslateMessage(&msg);   // 翻译键盘消息
        ::DispatchMessage(&msg);    // 分发消息到窗口过程
    }
    return msg.wParam;   // 返回程序退出代码
}

// 主窗口过程函数
#define IDT_TIMER 100001

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    static int  nNum;        // 计数
    static int  bSetTimer;   // 计时器的开关变量
    char        szText[56];
    PAINTSTRUCT ps;
    HDC         hdc;

    switch (message) {
    case WM_CREATE: bSetTimer = FALSE; break;
    case WM_PAINT:
        hdc = ::BeginPaint(hWnd, &ps);
        wsprintf(szText, "计数: %d", nNum);
        ::TextOut(hdc, 10, 10, szText, strlen(szText));
        ::EndPaint(hWnd, &ps);
        break;
    case WM_LBUTTONDOWN:
        if (bSetTimer) {
            // 关闭定时器
            ::KillTimer(hWnd, IDT_TIMER);
            bSetTimer = false;
        }
        else {
            if (::SetTimer(hWnd, IDT_TIMER, 1000, NULL) == 0) {
                ::MessageBox(hWnd, "安装定时器失败", "TimerDemo", MB_OK);
            }
            else {
                bSetTimer = TRUE;
            }
        }
        break;
    case WM_CLOSE:   // 用户要求关窗体
        if (bSetTimer) ::KillTimer(hWnd, IDT_TIMER);
        break;
    case WM_DESTROY: ::PostQuitMessage(0); return 0;
    case WM_TIMER:
        if (wparam == IDT_TIMER) {
            hdc = GetDC(hWnd);
            wsprintf(szText, "计数：%d", nNum++);
            ::TextOut(hdc, 10, 10, szText, strlen(szText));
        }
        break;
    }
    return ::DefWindowProc(hWnd, message, wparam, lparam);
}
